// str: string | number str 是一个联合类型，有肯能是字符串，也有可能是数字
function fn(str: string | number) {
    // return (<string>str).length;
    return (str as string).length;
    // <string>str 和 str as string 都是类型断言。
}


console.log(fn("20"));


// void 代表空。
// interface Icat {
//     name: string
//     run(): void 表示 run 没有返回值
// }

// interface Ifish {
//     name: string
//     swim(): void
// }

// let animal: Icat | Ifish = {
//     name: "黑猫警长",
//     run: () => {

//     }
// };
// console.log(animal.name);
// console.log((<Icat>animal).run());


// 函数的约束
// function addNum(x: number, y: string): string {
//     return x + y
// }
// addNum 这个函数需要传入两个值，x 是 number y 是 number 类型。
// 并且该函数有返回值，返回值的类型是 number
// 当函数有返回值的时候，并且我们不指定类型，会根据返回值的类型，来进行推论


// 匿名函数的约束

// var addNum = function (x, y) {
//     return x + y
// }

// (x: number, y: number) => number 代表 addNum 是一个函数，并且有返回值，返回的是一个 number
// var addNum: (x: number, y: number) => number = function (x: number, y: number): number {
//     return x + y
// }

// interface Iarr {
//     [prop: number]: string // prop 代表的是任意属性，可以随便起
// }
// let arr: Iarr = ['1', "2"];
// console.log(arr);


// 函数的参数

// 定义可选参数  z 是一个可选参数
// function addNum(x: number, y: number, z?: number): number {
//     return x + y + (z || 0)
// }
// 特别注意：可选参数是不允许出现在必选参数的前面。他可以出现在默认参数的前面。
// console.log(addNum(2, 3));


// y 就是函数的默认参数
// function addNum(x: number, y: number = 1): number {
//     return x + y
// }

// console.log(addNum(20, 21));


// 剩余参数 x: number 必选参数
// function addNum(x: number, ...args: number[]): number {
//     let sum = x
//     for (let i = 0; i < args.length; i++) {
//         sum = sum + args[i]
//     }
//     return sum
// }

// // 普通函数，也可以使用剩余参数。

// console.log(addNum(1, 2, 3, 4, 5));

// 函数的重载；


// function addNum() {
//     console.log("1");

// }

// function addNum() {
//     console.log("2");
// }
// addNum();
// 在js中，如果我们写了同名函数，后面的函数会覆盖前面函数。



// 声明一个函数 getUser，返回 string类型
// function getUser(name: string): string;

// // 仍然声明同名函数 getUser，返回数字类型
// function getUser(age: number): number;

// // 上面是函数的声明，下面是函数的实现。


// // any 是任意类型
// function getUser(str: any): any {
//     if (typeof str === 'string') {
//         return '我的名字' + str
//     } else {
//         return str
//     }
// }

// console.log(getUser('123456'));



// 函数的重载

function getUser(name: string): string;
function getUser(name: string, age: number): number;

// any 就是任意类型。
function getUser(name: string, age?: number): any {
    if (age) {
        return '我的名字' + name + '多大' + age
    } else {
        return '我的名字' + name + '多大保密'
    }
}